﻿using System;
using System.Windows;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls.SmartClient;
using Sinacor.UI.Bovespa.ManutencaoOrdens.Presenter;

namespace Sinacor.UI.Bovespa.ManutencaoOrdens.View.SmartClient
{
    /// <summary>
    /// Fgualberto.7comm - Task: 11079
    /// </summary>
    public partial class CasamentoPreBoletos : SinacorWindow, ICasamentoPreBoleto, System.ComponentModel.INotifyPropertyChanged
    {
        #region Campos
        private string _style;
        private Model.ChaveOrdem _ordem;
        private bool _isEnabledMenuCasamento = false;
        private bool _deletouInserido = false;

        public bool IsEnabledMenuCasamento 
        {
            get { return _isEnabledMenuCasamento; }
            
            set 
            {
                _isEnabledMenuCasamento = value; 
                Changed(_isEnabledMenuCasamento); 
            }
        }
        #endregion

        #region Presenter
        /// <summary>
        /// Casamento Manual
        /// </summary>
        public Sinacor.UI.Bovespa.ManutencaoOrdens.Presenter.CasamentoPreBoleto _presenter { get; set; }
        #endregion

        #region Metodos

        public CasamentoPreBoletos(Model.ChaveOrdem ordem)
        {
            this.InitializeComponent();
            this.DtgCasamentoPreBoleto.NewItemType = typeof(Model.PreBoleto);
            this._presenter = new Sinacor.UI.Bovespa.ManutencaoOrdens.Presenter.CasamentoPreBoleto(this);
            this.DataContext = this._presenter;
            
            this.DtgNegociosDisponiveis.NewItemType = typeof(Model.Negocio);

            DtgCasamentoPreBoleto.BeingUpdated += new CancelItemEventHandler(DtgCasamentoPreBoleto_BeingUpdated);
            DtgCasamentoPreBoleto.Deleting += new CancelItemsEventHandler(DtgCasamentoPreBoleto_Deleting);
            DtgCasamentoPreBoleto.Deleted += new ItemsEventHandler(DtgCasamentoPreBoleto_Deleted);

            _ordem = ordem;

            this.AfterInitialize += new RoutedEventHandler(CasamentoPreBoletos_AfterInitialize);
        }

        /// <summary>
        /// Inicalizar a Tela
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void CasamentoPreBoletos_AfterInitialize(object sender, RoutedEventArgs e)
        {
            _presenter.Inicializar(_ordem);
            CarregarNaturezaOperacao();
        }

        /// <summary>
        /// Casamento
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void menuCasamento_Click(object sender, RoutedEventArgs e)
        {
            this.Casamento();
        }

        /// <summary>
        /// Casamento
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void menuNegociosOrdem_Click(object sender, RoutedEventArgs e)
        {
            ConsultarNegociosDisponiveis();
        }

        private void menuPreboletoAutomatico_Loaded(object sender, RoutedEventArgs e)
        {
            SinacorContextMenuItem menu = (SinacorContextMenuItem)sender;

            menu.IsEnabled = (DtgNegociosDisponiveis.SelectedItems.Count >= 1);
        }

        private void menuPreboletoAutomatico_Click(object sender, RoutedEventArgs e)
        {
            foreach (Model.Negocio negocio in DtgNegociosDisponiveis.SelectedItems)
            {
                _presenter.IncluirPreBoletoAutomatico(negocio);
            }

            _presenter.RecalcularCamposControle();

            AtualizarNegociosDisponiveis();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DtgCasamentoPreBoleto_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                _style = string.Empty;
                if (e.OriginalSource is BaseRow)
                {
                    this._presenter.VerificarEstadoPreBoleto(((Model.PreBoleto)e.ItemInfo.Item));
                }
                e.Style = _style;
            }
        }

        /// <summary>
        /// Apresentar Pre Boleto Casado
        /// </summary>
        public void ApresentarPreBoletoCasado()
        {
            _style = BaseRow.GridRowBusiness02;
        }

        /// <summary>
        /// Apresentar Pre Boleto Casado
        /// </summary>
        public void ApresentarPreBoletoNaoCasado()
        {
            _style = BaseRow.GridRowBusiness06;
        }

        /// <summary>
        /// Apresentar Pre Boleto Parcialmente Casado
        /// </summary>
        public void ApresentarPreBoletoParcialmenteCasado()
        {
            _style = BaseRow.GridRowBusiness04;
        }

        /// <summary>
        /// Atualiza os dados sumarizados do field Controle
        /// </summary>
        public void AtualizarCamposControle()
        {
            this.TxtQtDigitada.UpdateTarget(SinacorDecimalTextBox.ValueProperty);

            if (_presenter.CamposControle.PrecoMedio.HasValue)
            {
                _presenter.CamposControle.PrecoMedio = Convert.ToDecimal(Math.Round(_presenter.CamposControle.Volume.Value, TxtPrecoMedio.Decimals));
            }

            this.TxtPrecoMedio.UpdateTarget(SinacorDecimalTextBox.ValueProperty);

            if (_presenter.CamposControle.Volume.HasValue)
            {
                _presenter.CamposControle.Volume = Convert.ToDecimal(Math.Round(_presenter.CamposControle.Volume.Value, TxtVolume.Decimals));
            }

            this.TxtVolume.UpdateTarget(SinacorDecimalTextBox.ValueProperty);

            this.TxtVlrMediaCambio.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            this.TxtVolumedoCambio.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            this.TxtSaldoOrdem.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
        }

        /// <summary>
        /// Atualizar as datas de pregão
        /// </summary>
        public void AtualizarDatasPregao()
        {
            this.CboDataOrdem.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        /// <summary>
        /// Atualizar Ordem
        /// </summary>
        public void AtualizarOrdem()
        {
            this.CboDataOrdem.UpdateTarget(SinacorComboBox.SelectedValueProperty);
            this.TxtNumeroOrdem.UpdateTarget(SinacorTextBox.TextProperty);
            this.TxtNumeroOrdemSubSequencia.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            this.TxtApelido.UpdateTarget(SinacorTextBox.TextProperty);
            this.TxtNatureza.UpdateTarget(SinacorTextBox.TextProperty);
            this.TxtAtivo.UpdateTarget(SinacorTextBox.TextProperty);
            this.TxtQtdeOrdem.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            this.TxtSaldoOrdem.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            this.TxtQtdeADRAnexoIV.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            this.TxtQtdADRAnexoV.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
        }

        /// <summary>
        /// Atualizar Pré Boletos
        /// </summary>
        public void AtualizarPreBoletos()
        {
            this.DtgCasamentoPreBoleto.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);                        
            IsEnabledMenuCasamento = (DtgCasamentoPreBoleto.Items.Count > 0);            
        }

        /// <summary>
        /// Mensagem para Confirmar Casamento
        /// </summary>
        public bool ConfirmaCasamento()
        {
            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.ManutencaoOrdens.Message.CasamentoPreBoletos").ToString(), 
                    SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        /// <summary>
        /// Confirmar Ação Salvar Pre-Boleto
        /// </summary>
        public bool ConfirmarAcaoSalvarPreBoleto()
        {
            string mensagem = string.Format(FindResource("Bovespa.ManutencaoOrdens.Message.ConfirmaSalvarPreBoleto").ToString(), _presenter.Ordem.NumeroOrdem);
            SinacorMessageBoxResult result = SinacorMessageBox.Show(mensagem, SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }

        /// <summary>
        /// Desabilitar Casamento
        /// </summary>
        public void DesabilitarCasamento()
        {
            IsEnabledMenuCasamento = false;            
        }

        /// <summary>
        /// Desabilitar Manutenção Casamento
        /// </summary>
        public void DesabilitarManutencaoPreBoletos()
        {
            IsEnabledMenuCasamento = false;
            DtgCasamentoPreBoleto.AllowBeginUpdate = false;
            DtgCasamentoPreBoleto.AllowDelete = false;
        }

        /// <summary>
        /// Habilitar Casamento
        /// </summary>
        public void HabilitarCasamento()
        {
            IsEnabledMenuCasamento = true;
        }

        /// <summary>
        /// Informar Operação Sucesso
        /// </summary>
        public void InformarOperacaoSucesso()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.ManutencaoOrdens.Message.OperacaoSucesso").ToString(), 
                                                SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        /// <summary>
        /// Proibir Acesso
        /// </summary>
        public void ProibirAcesso()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Ordens.Message.UsuarioSemPermissao").ToString(), 
                                                SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
            this.Close();
        }

        /// <summary>
        /// Proibir Acesso Ordem Não Permite Casamento
        /// </summary>
        public void ProibirAcessoOrdemNaoPermiteCasamento()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Ordens.Message.OrdemNaoPermiteCasamento").ToString(),
                                                SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
            this.Close();
        }

        /// <summary>
        /// Informar Operação Falha
        /// </summary>
        public void InformarOperacaoFalha()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.ManutencaoOrdens.Message.FalhaInclusao").ToString(),
                                                SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void HabilitarCamposEdicaoGridPreBoleto(bool habilitar)
        {
            DtgCasamentoPreBoleto.Columns["QtdNegocios"].AllowUpdate = habilitar;
            DtgCasamentoPreBoleto.Columns["Preco"].AllowUpdate = habilitar;
            DtgCasamentoPreBoleto.Columns["ContraParte"].AllowUpdate = habilitar;
        }

        public void ConsultarNegociosDisponiveis()
        {
            ShowUserWaitingProcess();

            _presenter.ConsultarNegociosDisponiveis(_ordem);

            HideUserWaitingProcess();
        }

        /// <summary>
        /// Casamento
        /// </summary>
        public void Casamento()
        {
            this.ClearServiceErrors();

            _presenter.CasarPreBoletos();
            this.AtualizarPreBoletos();

            base.HideUserWaitingProcess();
        }

        /// <summary>
        /// Salvar
        /// </summary>
        public void Salvar()
        {
            this.ClearServiceErrors();
            _presenter.RecalcularCamposControle();
            base.HideUserWaitingProcess();
        }


        /// <summary>
        /// Salvar Tudo 
        /// </summary>
        public bool Salvar_Tudo()
        {
            if (!this._presenter.Salvar())
            {
                return false;
            }
            return true;
        }

       
        /// <summary>
        /// Casamento Pré-Boleto
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void DtgCasamentoPreBoleto_InsertBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                this.ClearServiceErrors();
                this.CarregarCombos(e);                
            }
        }

        /// <summary>
        /// Alteração
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DtgCasamentoPreBoleto_UpdateBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                this.ClearServiceErrors();
                this.CarregarCombos(e);

                this.DesabilitarCasamento();
                _presenter.RecalcularCamposControle();
            }
        }

        private void DtgCasamentoPreBoleto_BeingUpdated(object sender, CancelItemEventArgs e)
        {
            _presenter.AnaliasEdicaoPreBoleto((Model.PreBoleto)DtgCasamentoPreBoleto.SelectedItem);
        }

        private void DtgCasamentoPreBoleto_Deleting(object sender, CancelItemsEventArgs e)
        {
            Model.PreBoleto preBoleto = (Model.PreBoleto)DtgCasamentoPreBoleto.SelectedItem;

            if (preBoleto.State == State.Inserted)
            {
                _deletouInserido = true;
            }
        }

        
        private void DtgCasamentoPreBoleto_Deleted(object sender, ItemsEventArgs e)
        {
            Model.PreBoleto preBoleto;

            if (_deletouInserido)
            {
                _deletouInserido = false;

                preBoleto = (Model.PreBoleto)DtgCasamentoPreBoleto.SelectedItem;

                _presenter.ExcluirPreBoletoNaoSalvo(preBoleto);
            }
        }

        /// <summary>
        /// Casamento Pre Boleto
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DtgCasamentoPreBoleto_Saving(object sender, CancelItemsEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
                this.ShowUserWaitingProcess();

                if (!this.Salvar_Tudo())
                    e.Cancel = true;

                this.AtualizarPreBoletos();
                this.HideUserWaitingProcess();
            }
        }

        /// <summary>
        /// Tratamento 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TxtQtdNegocios_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            SinacorDecimalTextBox txtBox = (SinacorDecimalTextBox)sender;
   
            switch (e.Key)
            {
                case System.Windows.Input.Key.OemPeriod:
                case System.Windows.Input.Key.AbntC2:
                    if (txtBox.Value * 1000000 <= 9999999999999999.9999M)
                    {
                        txtBox.Value *= 1000000;

                        txtBox.SelectionStart = txtBox.Text.Length;
                    }
                    break;

                case System.Windows.Input.Key.K:
                    if (txtBox.Value * 1000 <= 9999999999999999.9999M)
                    {
                        txtBox.Value *= 1000;
                        txtBox.SelectionStart = txtBox.Text.Length;
                    }
                    break;
            }
        }

        /// <summary>
        /// Carregar Natureza da Operação
        /// </summary>
        private void CarregarNaturezaOperacao()
        {
            if (_presenter.Ordem.NaturezaOperacao != null)
            {
                switch ((((EnumWrapper<Model.Enum.NaturezaOperacao>)_presenter.Ordem.NaturezaOperacao).Value.ToString()))
                {
                    case "Compra":
                        this.TxtNatureza.Text = Model.Enum.NaturezaOperacao.Compra.ToString();
                        break;
                    case "Venda":
                        this.TxtNatureza.Text = Model.Enum.NaturezaOperacao.Venda.ToString();
                        break;
                    case "CompraVenda":
                        this.TxtNatureza.Text = Model.Enum.NaturezaOperacao.CompraVenda.ToString();
                        break;
                    default:
                        this.TxtNatureza.Text = null;
                        break;
                }
            }
        }

        /// <summary>
        /// Lost Focus para preenchimento da coluna Volume Cambio
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TxtCambio_LostFocus(object sender, RoutedEventArgs e)
        {
            if (this.DtgCasamentoPreBoleto.EditItem != null)
            {
                Model.PreBoleto preBoleto = (Model.PreBoleto)this.DtgCasamentoPreBoleto.EditItem;
                SinacorDecimalTextBox valor = (SinacorDecimalTextBox)sender;
                if (valor.Value != null)
                {
                    preBoleto.ValorCambio = Convert.ToDecimal(valor.Value);
                    preBoleto.VolumeCambio = _presenter.CalcularVolumeCambio(preBoleto);
                }
            }
        }

        /// <summary>
        /// Carrega os Combos do Grid
        /// </summary>
        private void CarregarCombos(ItemEventArgs e)
        {
            SinacorComboBox comboCasamento = ControlHelper.FindChild((BaseRow)e.OriginalSource, "cmbCasamento") as SinacorComboBox;
            _presenter.TipoCasamento = EnumWrapper<Bovespa.ManutencaoOrdens.Model.Enum.TipoCasamento>.GetEnums();
            comboCasamento.ItemsSource = _presenter.TipoCasamento;
            comboCasamento.UpdateTarget(SinacorComboBox.ItemsSourceProperty);

            SinacorComboBox comboTipoEstrategia = ControlHelper.FindChild((BaseRow)e.OriginalSource, "cmbEstrategia") as SinacorComboBox;
            _presenter.TipoEstrategia = EnumWrapper<Bovespa.ManutencaoOrdens.Model.Enum.TipoEstrategia>.GetEnums();
            comboTipoEstrategia.ItemsSource = EnumWrapper<Bovespa.ManutencaoOrdens.Model.Enum.TipoEstrategia>.GetEnums();
            comboTipoEstrategia.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        #endregion 

        private void menuCasamento_Loaded(object sender, RoutedEventArgs e)
        {
            SinacorContextMenuItem menu = (SinacorContextMenuItem)sender;
            menu.IsEnabled = _isEnabledMenuCasamento;
        }

        #region ICasamentoPreBoleto Members

        public void HabilitarNovo()
        {
            this.DtgCasamentoPreBoleto.AllowBeginInsert = false;
        }

        public void AtualizarNegociosDisponiveis()
        {
            DtgNegociosDisponiveis.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        #endregion

        #region INotifyPropertyChanged Members

        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

        private void Changed(bool IsEnabledMenuCasamento)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("IsEnabledMenuCasamento"));
            }
        }

        #endregion
    }
}

